// 学习目标
// 知道解析器运行js分为哪两步
// 能够说出变量提升的步骤和运行过程
// 能够说出函数提升的步骤和运行过程

// 1、问
console.log(num)  //报错
// 2问
console.log(num); //undefined 坑1
var num=10;
// 3 问
fn();
function fn(){
    console.log('预解析 函数提升');
    
    
}
// 4问
fun();      //报错 坑2
var fun=function(){
    console.log('变量声明函数 无法预解析');     
    
}
//相当于执行了以下代码
// fun();
// var fun;
// function(){
//     console.log('变量声明函数 无法预解析');
// }



// js代码是由浏览器中的javascript解析器来执行的。javascript解析器在运行JavaScript代码的时候分为两步：预解析和代码执行
// （1）预解析 js引擎会把js里面所有的var 还有function提升到当前作用域的最前面
// （2）代码执行 按照代码书写的顺序从上往下执行
// 2预解析分为   变量提升 和 函数提升   变量提升把所有的变量声明提升到当前的作用域最前面 不提升赋值    函数提升就是把所有函数声明提升到当前作用域最前面 不调用函数

console.log('预解析案例----------------------');
var num=10;
fun();
function fun(){
    console.log(num);
    var num=20;
}
//相当于以下代码
var num;
function fun(){
    var num;          //变量提升指挥提升到当前作用域最前面  
    console.log(num); //按照作用域查找到上一层
    num=20;
}
fun(); //最后输出的结果是undefined 

console.log('预解析案例----------------------');
f1();
console.log(c);
console.log(b);
console.log(a);

function1(){
    var a=b=c=9;
    console.log(a);
    console.log(b);
    console.log(c);
}

console.log('相当于以下代码--------------------');
//先提升函数的声明
function1(){
    var a=b=c=9;
    //相当于
    // var a=9;b=9;c=9; 
    // 注意这里的b和c没有声明 函数内部没有直接var声明的当作全局变量看
    //如果需要集体声明 采用以下的方式
    // var a=9,b=9,c=9;
    console.log(a);
    console.log(b);
    console.log(c);
}

f1();
console.log(c);
console.log(b);
console.log(a);
